package capitulo3;

public class Tema23_Autoboxing {

	static Integer xref;

	public static void main(String[] args) {

		Integer i = new Integer(245); // make it
		i++; // unwrap it, increment it,
				// rewrap it
		System.out.println("i = " + i); // print it

		/*
		 * Antes mencionamos que los objetos envoltorio son inmutables! Lo que
		 * realmente ha pasado, es que un segundo objeto envoltorio fue creado
		 * con el valor a 568. Si solo pudieramos acceder al primer objeto
		 * envoltorio, podriamos probarlo.
		 */

		System.out.println("\n");
		Integer y = 567; // crea un envoltorio
		Integer x = y; // asigna una segunda referencia

		System.out.println(y == x); // verifica la referencia

		y++; // unwrap, use, "rewrap"
		System.out.println(x + " " + y); // imprime el valor
		System.out.println(y == x); // verifica que la referencia
									// se hacen a distintos objetos

		/*
		 * Boxing, ==, y equals()
		 */
		System.out.println("\nBoxing, ==, y equals() ");
		Integer i3 = 10;
		Integer i4 = 10;
		if (i3 == i4)
			System.out.println("same object");
		if (i3.equals(i4))
			System.out.println("meaningfully equal");

		/*
		 * Donde se pueden usar el Boxing
		 */
		System.out.println("\nDonde se pueden usar el Boxing");
		Tema23_Autoboxing u = new Tema23_Autoboxing();
		u.go(5);

		/*
		 * Las variables con referencia a envoltorios pueden ser null
		 */
		doStuff(xref); // porque "xref" no esta refiriendose a un objeto
						// Integer, asi que no hay valor para hacerle unbox.

	}

	boolean go(Integer i) { // boxes the int it was passed
		Boolean ifSo = true; // boxes the literal
		Short s = 300; // boxes the primitive
		if (ifSo) { // unboxing
			System.out.println(++s); // unboxes, increments, reboxes
		}
		return !ifSo; // unboxes, returns the inverse
	}

	static void doStuff(int z) {
		int z2 = 5;
		System.out.println(z2 + z);
	}
}
